#ifndef NETWORKMANAGER_H
#define NETWORKMANAGER_H

#include <QObject>
#include <QTcpSocket>
#include <QTimer>
#include <QAbstractSocket>
#include "MessageType.h"

class NetworkManager : public QTcpSocket
{
    Q_OBJECT

public:
    explicit NetworkManager(QObject *parent = nullptr);
    ~NetworkManager();

    // 连接到服务器
    bool connectToServer(const QString& host, quint16 port);
    // 断开连接
    void disconnectFromServer();
    // 发送登录请求
    void sendLoginRequest(const QString& username, const QString& password);
    // 发送注册请求
    void sendRegisterRequest(const QString& username, const QString& password);
    // 检查连接状态
    bool isConnected() const;
    // 获取错误信息
    QString getError() const;
    // 发送TLV格式数据
    void sendTLV(TaskType type, int len, const QByteArray &msg);

signals:
    // 登录响应信号
    void loginResponse(bool success, const QString& message);
    // 注册响应信号
    void registerResponse(bool success, const QString& message);
    // 网络错误信号
    void networkError(const QString& error);
    //用于登录第二阶段直接收取设备相关信息
    void deviceListReceived(const QString& deviceListData);

    void Record_STM32_info(const QString& message);

private slots:
    // 处理连接成功
    void onConnected();
    // 处理连接断开
    void onDisconnected();
    // 处理接收数据
    void onReadyRead();
    // 处理连接错误
    void onErrorOccurred(QAbstractSocket::SocketError socketError);
    // 重连定时器超时
    void onReconnectTimeout();

private:
    // 初始化网络连接
    void setupNetwork();
    // 处理登录响应
    //void handleLoginResponse(bool success, const QString& message);
    // 处理接收到的数据包
    void handleReceivedPacket(const Packet& packet);
    
    int sendn(QByteArray buf, int len);

    QTimer *reconnectTimer;
    QString currentError;
    bool connectedFlag;
    
    // 用于接收数据的缓冲区
    Packet currentPacket;
    int expectedDataSize;
    
    // 待处理的用户名和密码
    QString pendingUsername;
    QString pendingPassword;

    int count = 0;
};

#endif // NETWORKMANAGER_H
